/*
 * 版权所有 (C) 2018 知启蒙(ZHIQIM) 保留所有权利。
 * 
 * 欢迎到知启蒙网站（https://www.zhiqim.com）购买正版软件，知启蒙还提供许多开源框架和软件。
 * 
 * 1、本软件产品所有源代码受《中华人民共和国著作权法》和其他有关法律、法规的保护，其所有知识产权归湖南知启蒙科技有限公司所有；
 * 2、禁止复制和修改。不得复制修改、翻译或改编本软件所有源代码，或者基于本软件产品创作衍生作品；
 * 3、禁止进行逆向工程。不得对本软件的源代码进行逆向工程、反编译或试图以其他方式发现软件的源代码；
 * 4、个别授权：如需进行商业性的销售、复制、分发，包括但不限于软件销售、预装、捆绑等，必须获得知启蒙的书面授权和许可；
 * 5、保留权利：本注释未明示授权的其他一切权利仍归知启蒙所有，任何人使用其他权利时必须获得知启蒙的书面同意。
 */
package net.redxyz.repost.service.dao;

import java.util.ArrayList;
import java.util.List;

import net.redxyz.repost.service.Constants;
import net.redxyz.top.dbo.sys.SysNavWeb;

import org.zhiqim.httpd.HttpRequest;
import org.zhiqim.kernel.annotation.AnAlias;
import org.zhiqim.kernel.util.Strings;
import org.zhiqim.orm.ORM;
import org.zhiqim.orm.dbo.Selector;

/**
 * 功能导航数据访问对象，页面直接调用
 *
 * @version v1.0.0 @author zouzhigang 2014-3-21 新建与整理
 */
@AnAlias("NavWebDao")
public class NavWebDao implements Constants
{
    /** 获取一级导航列表  */
    public static List<SysNavWeb> getNav1List() throws Exception
    {
        List<SysNavWeb> list = new ArrayList<>();
        List<SysNavWeb> navList = getNavList();
        for (SysNavWeb nav : navList)
        {
            if (nav.getNavLevel() == 1 && nav.getNavType() == 1)
                list.add(nav);
        }
        
        return list;
    }
    
    /** 取一级光标菜单Id，以页面配置页面为准，为空则取本地数据库配置 */
    public static String getLinkNav1Id(HttpRequest request, String parentUrl) throws Exception
    {
        String path = (parentUrl == null)?request.getPathInContext():parentUrl;
        List<SysNavWeb> navList = getNavList();
        for (SysNavWeb nav : navList)
        {
            if (nav.getNavType() == 3 || nav.getNavLevel() == 3)
                continue;
            
            if (nav.getNavUrl().equals(path))
                return (nav.getNavLevel() == 1)?nav.getNavId():nav.getParentId();
        }
        
        return null;
    }
    
    /** 取二级光标菜单Id,以页面配置页面为准，为空则取本地数据库配置 */
    public static String getLinkNav2Id(HttpRequest request, String parentUrl) throws Exception
    {
        String path = (parentUrl == null)?request.getPathInContext():parentUrl;
        List<SysNavWeb> navList = getNavList();
        for (SysNavWeb nav : navList)
        {
            if (nav.getNavLevel() == 1)
                continue;
            
            if (nav.getNavUrl().equals(path))
                return (nav.getNavLevel() == 2)?nav.getNavId():nav.getParentId();
        }
        
        return null;
    }
    
    /** 判断存在子菜单 */
    public static boolean hasChild(String navId) throws Exception
    {
        List<SysNavWeb> navList = getNavList();
        for (SysNavWeb nav : navList)
        {
            if (nav.getNavType() == 1 && nav.getParentId().equals(navId))
                return true;
        }
        
        return false;
    }
    
    /** 获取子菜单列表 */
    public static List<SysNavWeb> getChildren(String navId) throws Exception
    {
        List<SysNavWeb> list = new ArrayList<SysNavWeb>();
        List<SysNavWeb> navList = getNavList();
        for (SysNavWeb nav : navList)
        {
            if (nav.getNavType() == 1 && nav.getParentId().equals(navId))
                list.add(nav);
        }
        
        return list;
    }

    /** 判断数据库中是否配置此链接 */
    public static boolean hasUrlPermission(String pageUrl) throws Exception
    {
        List<SysNavWeb> navList = getNavList();
        for (SysNavWeb nav : navList)
        {
            if (nav.getNavUrl().equals(pageUrl))
                return true;
        }
        return false;
    }
    
    /** 获取导航列表，去掉可能的空格 */
    private static List<SysNavWeb> getNavList() throws Exception
    {
        //1，加载所有配置链接到缓存
        Selector selector = new Selector();
        selector.addMaybe("navStatus", 1);
        selector.addOrderbyAsc("navLevel");
        selector.addOrderbyAsc("navSeq");
        List<SysNavWeb> navList = ORM.table().list(SysNavWeb.class, selector);

        //2,初始化相关数据
        for(SysNavWeb nav : navList)
        {
            //1、去掉空格
            nav.setNavId(Strings.trim(nav.getNavId()));
            nav.setParentId(Strings.trim(nav.getParentId()));
            nav.setNavName(Strings.trim(nav.getNavName()));
            nav.setNavUrl(Strings.trim(nav.getNavUrl()));
        }
        
        return navList;
    }
}
